package com.ksrm.SpringTest;


import com.ksrm.dao.UserDao;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class SpringTest01 {
    @Test
//    测试Bean标签scope属性singleton prototype 同时也时无参构造方法实例化
    public  void test1(){
        /**
         * Bean的生命周期分为 创建 运行 销毁
         *
         */

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//        app代表加载配置文件 创建spring容器
        UserDao userDao1 = (UserDao) app.getBean("userDao-singleton");//这一步叫调用getBean()方法实例化Bean
        UserDao userDao2 = (UserDao) app.getBean("userDao-singleton");
        System.out.println(userDao1);
        System.out.println(userDao2);
//        当scope属性为singleton时 代表spring容器中userDao的bean存在一个
//        当scope属性为singleton时 首先加载配置文件 而配置文件一旦被加载,UserDaoImpl对象的无参构造就会在容器中创建 所以只会创建一次也就是getBean只会实例化一次 实例化时机就是容器被加载时
//        所有的getBean公用一个对象 容器存在时对象就一直活着容器销毁时对象也就销毁了 创建的对象是UserDaoImpl对象
        System.out.println("--------------------------------------------");
        UserDao userDao3 = (UserDao) app.getBean("userDao-prototype");
        UserDao userDao4 = (UserDao) app.getBean("userDao-prototype");//这一步叫调用getBean()方法实例化Bean
        System.out.println(userDao3);
        System.out.println(userDao4);
//        当scope属性为prototype时 代表spring容器中userDao的bean存在多个
//        当scope属性为prototype时 首先加载配置文件,配置文件加载完毕后每次getBean()时UserDaoImpl无参构造就会在容器中创建 所以有几个getBean就会创建几次
//            每个getBean都是新的独立的对象 所以只会在getBean时才会创建 只有对象在使用中时才会活着,而当对象长时间不使用时就会被java垃圾回收器回收
        //scope翻译的意思为对象作用范围
    }



    @Test
//    测试bean标签的初始化和销毁
    public  void test2(){
            ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao= (UserDao) app.getBean("userDao-singleton");
            app.close();//手动关闭
    }

    @Test
    public  void test3(){
        /**
         * bean实例化的三种方式
         * 无参构造方法实例化
         * 工厂静态方法实例化
         * 工厂实例方法实例化
         */
//        工厂静态方法实例化
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("StaticFactory.xml");
        Object userDao = app.getBean("us");
        System.out.println(userDao);

    }



}
